/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Xadrez.Controller;

import Xadrez.Modelo.Piece;

import Xadrez.View.MatchFrame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import Xadrez.Modelo.Match;
import Xadrez.Modelo.TesteIA;


/**
 *
 * @author Leonardo
 */
public class MatchController {

    public Match match;
    private MatchFrame panel;
    private boolean versusIA;
    //objeto TesteIA relacionado com a gambiarra
    //que eu fiz quando se aperta o botão de mover
    private TesteIA testeIA;

    public MatchController() {

        match = new Match();

        testeIA = new TesteIA();
        versusIA = true;

        panel = new MatchFrame();
        panel.AdicionarOuvinte(new Ouvinte());
        panel.setVisible(true);

        refresh();
    }

    public MatchController(boolean vsIA) {

        match = new Match();

        testeIA = new TesteIA();
        versusIA = vsIA;

        panel = new MatchFrame();
        panel.AdicionarOuvinte(new Ouvinte());
        panel.setVisible(true);
        if (versusIA) {
            panel.setTitle("Xadrez contra computador");
        } else {
            panel.setTitle("Xadrez contra outra pessoa");
        }

        refresh();
    }

    void Paint() {
       panel.Paint(match);
    }

    class Ouvinte implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            Object fonte = e.getSource();

            if (fonte == panel.getButton1()) {

                if (match.getEndGame()) {
                } else {

                    int oX = Integer.parseInt(panel.jTextField4.getText());
                    int oY = Integer.parseInt(panel.jTextField5.getText());

                    int dX = Integer.parseInt(panel.jTextField6.getText());
                    int dY = Integer.parseInt(panel.jTextField7.getText());


                    match.move(oX, oY, dX, dY);
                    
                    if(match.getPlayer1().getXeque()) match.xequeMate(match.getPlayer1());

                    if(match.getPlayer2().getXeque()) match.xequeMate(match.getPlayer2());

                    
                    refresh();




                    //Depois de cada jogada, o computador vai calcular uma jogada nova

                    if (versusIA) {


                        testeIA.registrarJogada(oX, oY, dX, dY);

                        if (match.getTurn().equals(match.getPlayer2().getColor())) {

                            do {
                                //testeIA.randomMove(match);
                                //testeIA.gulosoMove(match);
                                testeIA.sicilianDefenseOpening(match);

                                match.move(testeIA.ox, testeIA.oy, testeIA.dx, testeIA.dy);
                                testeIA.registrarJogada(testeIA.ox, testeIA.oy, testeIA.dx, testeIA.dy);

                            } while ((!match.getMovimentoDesfeito()) && (match.getPlayer2().getXeque()) && (!match.getEndGame()));

                            while (match.getRemendoBug()) {
                                match.decrementaTurno();
                                match.setRemendoBug(false);

                                testeIA.randomMove(match);
                                match.move(testeIA.ox, testeIA.oy, testeIA.dx, testeIA.dy);
                                testeIA.registrarJogada(testeIA.ox, testeIA.oy, testeIA.dx, testeIA.dy);
                            }

                        }

                        
                            if(match.getPlayer1().getXeque()) match.xequeMate(match.getPlayer1());

                            if(match.getPlayer2().getXeque()) match.xequeMate(match.getPlayer2());



                        refresh();
                    }


                    


                }




            }

            if (fonte == panel.getButtonShow()) {

                int oX = Integer.parseInt(panel.jTextField4.getText());
                int oY = Integer.parseInt(panel.jTextField5.getText());
                showOptions(oX, oY);

            }

            if (fonte == panel.getButtonUndo()) {

                match.undoMove(3);
                if (versusIA) {
                    match.undoMove(3);
                }
                refresh();

            }

        }
    }

    private void showOptions(int ox, int oy) {

    //    panel.jTextArea1.setText("");

   //     panel.jTextArea1.append("  0  1  2  3  4  5  6  7 \n");
        boolean possibilidades[][]=new boolean[8][8];

        String linha;

        for (int j = 0; j < 8; j++) {

      //      panel.jTextArea1.setAlignmentY(j + 1);


            linha = Integer.toString(j);
            

            for (int i = 0; i < 8; i++) {

                if (match.isValidMove(ox, oy, i, j)) {
                    linha = linha.concat(" # ");
                    possibilidades[i][j]=true;
                } else {

                    if (match.getPiece(i, j) == null) {

                        linha = linha.concat(" . ");
                    possibilidades[i][j]=false;

                    } else {
                        linha = linha.concat(imprimePeca(match.getPiece(i, j)));
                    }


                }


            }


  //          panel.jTextArea1.append(linha);
 //           panel.jTextArea1.append("\n");
            panel.setPossibilidades(possibilidades);
            
        }

    }

    private String imprimePeca(Piece p) {
        String s = " X ";

        if (p.toString().equals("cavalo")) {

            if (p.getColor().equals("White")) {
                s = " C ";
            } else {
                s = " c ";

            }

        }
        if (p.toString().equals("torre")) {

            if (p.getColor().equals("White")) {
                s = " T ";
            } else {
                s = " t ";

            }

        }
        if (p.toString().equals("bispo")) {

            if (p.getColor().equals("White")) {
                s = " B ";
            } else {
                s = " b ";

            }

        }

        if (p.toString().equals("rainha")) {

            if (p.getColor().equals("White")) {
                s = " D ";
            } else {
                s = " d ";

            }

        }
        if (p.toString().equals("rei")) {

            if (p.getColor().equals("White")) {
                s = " R ";
            } else {
                s = " r ";

            }

        }

        if (p.toString().equals("peão")) {

            if (p.getColor().equals("White")) {
                s = " P ";
            } else {
                s = " p ";

            }

        }
        return s;
    }

    private void refresh() {
        panel.Paint(match);
        
        if (match.getPlayer1().getXeque()) {
            javax.swing.JDialog f = new javax.swing.JDialog();
            f.setSize(250, 150);
            javax.swing.JOptionPane.showMessageDialog(f, "Branco está em xeque", "Aviso", javax.swing.JOptionPane.WARNING_MESSAGE);

        }
        if (match.getPlayer2().getXeque()) {
            javax.swing.JDialog f = new javax.swing.JDialog();
            f.setSize(250, 150);
            javax.swing.JOptionPane.showMessageDialog(f, "Preto está em xeque", "Aviso", javax.swing.JOptionPane.WARNING_MESSAGE);

        }

        if (match.getEndGame()) {
            javax.swing.JDialog f = new javax.swing.JDialog();
            f.setSize(250, 150);
            javax.swing.JOptionPane.showMessageDialog(f, "Xeque-Mate", "Fim de Jogo", javax.swing.JOptionPane.WARNING_MESSAGE);
        }

        if (match.getTurn().equals("White")) {
            panel.getRadio1().setSelected(false);
            panel.getRadio2().setSelected(true);
        } else {
            panel.getRadio1().setSelected(true);
            panel.getRadio2().setSelected(false);
        }

        panel.jLabel3.setText("Turno nº: " + match.getNumberOfTurns());


//        panel.jTextArea1.setText("");

    //    panel.jTextArea1.append("  0  1  2  3  4  5  6  7 \n");
       
        String linha;

        for (int j = 0; j < 8; j++) {

//            panel.jTextArea1.setAlignmentY(j + 1);

            linha = Integer.toString(j);
            

            for (int i = 0; i < 8; i++) {

                if (match.getPiece(i, j) == null) {

                    linha = linha.concat(" . ");
                    

                } else {

                    linha = linha.concat(imprimePeca(match.getPiece(i, j)));

                }

            }


  //          panel.jTextArea1.append(linha);
    //        panel.jTextArea1.append("\n");

            
        }

    }
}
